package com.demo.base.duty;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;

/**
 * @author : YU.TAN
 * @date : 2021/10/28 13:47
 * <p>
 * 责任链模式：责任链模式为请求创建了一个接收者对象的链。执行链上有多个对象节点，
 * 每个对象节点都有机会（条件匹配）处理请求事务，如果某个对象节点处理完了，
 * 就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。
 * 这种模式给予请求的类型，对请求的发送者和接收者进行解耦。
 * <p>
 * 责任链模式实际上是一种处理请求的模式，它让多个处理器（对象节点）都有机会处理该请求，直到其中某个处理成功为止。责任链模式把多个处理器串成链，然后让请求在链上传递
 * <p>
 * <p>
 * <p>
 * 责任链模式使用步骤：
 * 一个接口或者抽象类
 * 每个对象差异化处理
 * 对象链（数组）初始化（连起来）
 */
public abstract class AbstractHandler {

    /**
     * 有一个指向责任下一个对象的属性
     * 一个设置下一个对象的set方法
     * 给子类对象差异化实现的方法（如以下代码的doFilter方法）
     */

    /**
     * 责任链中的下一个处理对象
     */
    private AbstractHandler nextHandler;


    /**
     * 构造器
     * 责任链中的下一个处理对象
     */
    public void setNextHandler(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    /**
     * 具体参数拦截逻辑,给子类去实现
     * @param request
     * @param response
     * @return
     */
    public void filter(Request request, Response response) {
        boolean filter = doFilter(request, response);
        if (getNextHandler() != null && filter) {
            getNextHandler().filter(request, response);
        }
    }


    public AbstractHandler getNextHandler() {
        return nextHandler;
    }

    /**
     * 1
     * @param request 1
     * @param response 1
     * @return
     */
   public abstract boolean doFilter(Request request, Response response);
}
